#include "ipc.h"

key_t shm_key;
key_t sem_key;
int shm_id;
int sem_id;
shm_data_t *shm_data;

void sem_down(int sem_id) {
    struct sembuf sem_op = {0, -1, SEM_UNDO};
    if (semop(sem_id, &sem_op, 1) < 0) {
        perror("sem_down failed");
        exit(EXIT_FAILURE);
    }
}

void sem_up(int sem_id) {
    struct sembuf sem_op = {0, 1, SEM_UNDO};
    if (semop(sem_id, &sem_op, 1) < 0) {
        perror("sem_up failed");
        exit(EXIT_FAILURE);
    }
}

void init_ipc() {
    shm_key = 1234;
    sem_key = 5678;

    shm_id = shmget(shm_key, sizeof(shm_data_t), IPC_CREAT | 0666);
    if (shm_id < 0) {
        perror("shmget failed");
        exit(EXIT_FAILURE);
    }

    shm_data = (shm_data_t *)shmat(shm_id, NULL, 0);
    if (shm_data == (void *)-1) {
        perror("shmat failed");
        exit(EXIT_FAILURE);
    }

    sem_id = semget(sem_key, 1, IPC_CREAT | 0666);
    if (sem_id < 0) {
        perror("semget failed");
        exit(EXIT_FAILURE);
    }

    semctl(sem_id, 0, SETVAL, 1);  // 初始化信号量为1
}

void cleanup_ipc() {
    shmdt(shm_data);
    shmctl(shm_id, IPC_RMID, NULL);
    semctl(sem_id, 0, IPC_RMID);
}
